package org.zch.service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestParam;
import org.zch.entity.vo.*;
import org.zch.entity.po.UserInfoPO;

import java.util.List;

/**
 * 用户信息
 *
 * @author 刘新
 */
@Service
public interface UserService {

    /**
     * 查询所有用户
     *
     * @param userInfoPO
     * @return
     */
    AllUserDataVO search(UserInfoPO userInfoPO);

    /**
     * 判断是否为新用户
     *
     * @param mac 设备码
     * @return
     */
    NewUserVO getUserBean(String mac);


    /**
     * 创建新用户
     *
     * @param mac 设备码
     * @return
     */
    @Async
    @Transactional(rollbackFor = Exception.class)
    String setNewUser(String mac);


    /**
     * 根据code获取用户信息
     *
     * @param code 用户编码
     * @return 用户信息
     */
    UserInfoVO getByCode(String code);

    /**
     * 根据code获取用户收货地址
     *
     * @param code 用户编码
     * @return
     */
    String getUserAddressById(String code);

    /**
     * 根据id查询用户唠额
     *
     * @param code 用户编码
     * @return
     */
    Integer getUserLaoNumByCode(String code);

    /**
     * 根据code修改用户唠额
     *
     * @param updatePO
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    Integer setUserLaoNumByCode(UserInfoPO updatePO);

    /**
     * 根据code获取用户手机号
     *
     * @param code 用户编码
     * @return 用户手机号
     */
    String getUserPhoneById(String code);

    /**
     * 根据mac获取用户信息
     *
     * @param mac 设备码
     * @return UserInfoPO 用户信息实体
     */
    UserInfoPO getUserByMac(String mac);

    /**
     * 根据用户mac获取用户id
     *
     * @param mac 设备码
     * @return id 用户id
     */
    Integer getUserIdByMac(String mac);

    /**
     * 修改方法
     *
     * @param userInfoPO
     * @return
     */
    Integer update(UserInfoPO userInfoPO);

    /**
     * 排行榜
     *
     * @param code 用户编码
     * @return
     */
    RankingVO getUserRanking(String code);

    /**
     * 获取签到数据
     *
     * @param code 用户编码
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    SignVO getUserSign(String code);


    /**
     * 签到
     *
     * @param code    用户编码
     * @param signNum 连续签到次数
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    Integer setUserSign(String code, Integer signNum);

    /**
     * 变更金额
     * 例如：用户1 金额增加10，则changeValues = 10；
     * 用户2 金额减少20，则changeValues = -20
     *
     * @param userCode     用户编码
     * @param changeValues 变化数值
     * @return
     */
    Integer updateLaoMoney(String userCode, Integer changeValues);

    /**
     * 根据用户code，批量查询用户信息
     * @param userCodes
     * @return
     */
    List<UserInfoVO> getByCodes(List<String> userCodes);


    /**
     * 修改用户头像
     * @param headPic 新头像url
     * @param code 用户code
     * @return
     */
    Integer updateUserHeadPic(String headPic, String code);
}
